package com.itheima.threadpool1;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 线程池
 *      传统的线程机制起始是存在资源浪费的
 *      每一个线程使用完毕了就要删除
 *      下一次想使用线程的时候又要重更新创建一个对象
 *          -- 我们准备一个容器
 *          -- 当有新任务的时候 线程池就会创建一个新线程装进容器里
 *          -- 当任务执行完毕后 他不会去销毁这个线程 而是将这个线程归还给线程池容器
 *          -- 当一个线程还没有用完这个线程对象 又来了个新任务 线程池会创建新的线程对象 然后在保存到池子里
 *          -- 所以 他不是跟数据库连接池一样先初始化一堆的对象 而是来一个就创建一个 再装进去
 *          -- 当达到了线程池的容量上限 新任务来了他就不能创建新线程对象 只能等其他的用完了再使用
 *
 * 代码实现
 *      -- 创建线程池
 *      -- 提交任务
 *      -- 所有的任务提交完毕 关闭线程池
 *
 *      Executors：调用这个工具类的不同方法返回不同类型的
 *      两个方法：public static ExecutorService newCachedThreadPool()    //创建一个没有上限的线程池
 *              public static ExecutorService newFixedThreadPool(int nThread) //创建一个有上限的线程池
 *
 */
public class MyThreadPoolDemo {

    public static void main(String[] args) throws Exception {

        //1.创建一个线程池对象
//        ExecutorService pool1 = Executors.newCachedThreadPool() ;
        ExecutorService pool1 = Executors.newFixedThreadPool(2) ;

        //创建任务 -->Runnable
        MyRunnable myRunnable = new MyRunnable() ;

        Thread.sleep(1000); //每次任务提交都睡一秒钟 让下一个线程使用上前一个线程还回去的那个线程

        //提交任务
        pool1.submit(myRunnable);
        Thread.sleep(1000); //每次任务提交都睡一秒钟 让下一个线程使用上前一个线程还回去的那个线程
        pool1.submit(new MyRunnable());
        Thread.sleep(1000); //每次任务提交都睡一秒钟 让下一个线程使用上前一个线程还回去的那个线程
        pool1.submit(new MyRunnable());
        Thread.sleep(1000); //每次任务提交都睡一秒钟 让下一个线程使用上前一个线程还回去的那个线程
        pool1.submit(new MyRunnable());
        Thread.sleep(1000); //每次任务提交都睡一秒钟 让下一个线程使用上前一个线程还回去的那个线程
        pool1.submit(new MyRunnable());
        Thread.sleep(1000); //每次任务提交都睡一秒钟 让下一个线程使用上前一个线程还回去的那个线程
        pool1.submit(new MyRunnable());
        Thread.sleep(1000); //每次任务提交都睡一秒钟 让下一个线程使用上前一个线程还回去的那个线程
        pool1.submit(new MyRunnable());Thread.sleep(1000); //每次任务提交都睡一秒钟 让下一个线程使用上前一个线程还回去的那个线程

        //销毁线程池
        pool1.shutdown();
    }
}
